在我們開發完成 DAG 之後,通常並非一次性就結束了,隨著時間過去,需求有持續不斷的改變,而我們的程式也必須持續的修改以及優化。有一個良好的開發流程以及 CI/CD 流程,可以幫助我們開發以及部署的品質。
這邊以 Gitflow 開發流程作為基礎來介紹 DAG 的開發部署流程。Gitflow 是許多團隊的開發時會參考的流程,於2010年時由 Vincent Driessen 在 nvie 發表。Gitflow 將不同分支分配給非常具體的角色,並定義它們應該在何時以及怎麼交互。
圖片出處:
https://nvie.com/posts/a-successful-git-branching-model/
對於不熟悉流程的人我們可以參考 Vincent Driessen 的文章(文章位置同上圖圖片出處)
在 Gitflow 的建議中,開發分成幾種branch:
Master
主要的產品branch,包含了已經經過測試和驗證的穩定代碼。當開發完成並經過測試,可以合併到 Master branch,形成新的版本。
Develop
作為持續開發的分支,包含了最新的功能和修復。所有新功能和修復的工作都在這個分支上進行,並進行持續集成和測試。
Feature
用於開發單獨的功能或新功能。從 develop 拉出開發,開發完成後合併回 develop。
Release
開發到一定階段時,用於準備新版本的發布,使用 release 階段做上線前的最後測試。
Hotfix
用於緊急修復產品的錯誤。production環境中出現錯誤,創建一個hotfix branch,進行修復。完成後,合併回 develop 和 master。
在我們 DAG 開發時,我們根據開發的階段會使用到不同的開發環境,也會將 DAG 部署到不同的環境當中。因此針對以上的 Gitflow 我們也需要設定相對的環境。
在開發時,我們要管理的不只是程式碼,同時也需要對於開發的環境。在上述的開發 branch 中,我們需要盡量保持各個環境的獨立,避免環境設定彼此互相干擾,也確保同樣的程式能夠在各個環境都能正確地執行。
要能做到比較完整的開發流程,基本上我們會需要四個環境進行開發為佳,當然隨著團隊的考量以及預算的考量,可以對此作出取捨
由於上述環境基本上都會是相同的配置,所以如果能使用 IaC(Infrastructure as Code)工具來進行配置,會是對於我們的工作非常的有幫助,既可以提升建立速度,也可以確保不會有人為疏失的干擾。可以參考的服務有 Terraform、AWS CDK、Azure Resource Manager (ARM) Templates、Azure Bicep、Google Cloud Deployment Manager 等等。
在開發以及部署的流程中,CI/CD可以幫助我們有品質及有效率的提升整體流程。CI/CD 代表持續整合(Continuous Integration)和持續交付/持續部署(Continuous Delivery/Continuous Deployment)。其核心在於自動化和改善軟體交付過程,以實現更快速、可預測和可靠的軟體交付。
在 Gitflow 開發流程中,除了在 feature branch 開發之外,我們 merge 到 develop、release、master 都可以加入 CI/CD pipeline 使用程式自動部署至上述我們所說明的對應環境當中。在CI/CD 中也包含了測試,因此也可以使用程式做最基本的功能檢測。如此可以提升軟體品質,也可以開發者許多寶貴的時間。
CI/CD使用各種工具和平臺實現,包括Jenkins、Travis CI、CircleCI、GitLab CI/CD、GitHub Actions等。而雲服務提供商像是AWS、Azure、Google Cloud也皆有提供了CI/CD服務。
CI/CD可以參考下面範例:
jobs: testing:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v1
- name: Setup Python
uses: actions/setup-python@v1
with:
python-version: 3.7.0
architecture: x64
- name: Install Flake8
run: pip install flake8
- name: Run Flake8
run: flake8
- name: Install Pylint
run: pip install pylint
- name: Run Pylint
run: find . -name "*.py" | xargs pylint --output-format=colorized
- name: Install dependencies
run: pip install apache-airflow==2.6.0 pytest
- name: Test DAG run: pytest tests/
在 merge 至指定 branch 時觸發相關的 CI/CD 流程,可以將我們之前所寫的 DAG 經過測試後部署至相對環境當中,使開發團隊能夠更快地交付高品質的 Data pipeline。
今天講到了許多關於開發及部署流程的部分,對於這些流程,每個團隊所看重的部分不同,因此了解各種做法之後可以與團隊共同討論,找出最適合自己的產品以及自己團隊的做法!